package com.leyou.item.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpecParamDTO;
import com.leyou.item.entity.SpecGroup;
import com.leyou.item.mapper.SpecGroupMapper;
import com.leyou.item.service.SpecGroupService;
import com.leyou.item.service.SpecParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 规格参数的分组表，每个商品分类下有多个规格参数组(SpecGroup)表服务实现类
 *
 * @author makejava
 * @since 2020-11-17 11:10:33
 */
@Service("specGroupService")
public class SpecGroupServiceImpl extends ServiceImpl<SpecGroupMapper, SpecGroup> implements SpecGroupService {

    @Autowired
    private SpecParamService paramService;

    @Override
    public List<SpecGroupDTO> querySpecList(Long categoryId) {
        // 1.查询分类下的规格组
        List<SpecGroup> groups = query().eq("category_id", categoryId).list();
        List<SpecGroupDTO> groupDTOList = SpecGroupDTO.convertEntityList(groups);
        if(CollectionUtils.isEmpty(groupDTOList)){
            // 为空，结束
            return groupDTOList;
        }

        // 2.所有的规格组 及 组内参数的映射, key 是groupId，值是该group下的所有param的集合
        // 2.1.查询出所有的param
        List<SpecParamDTO> allParams = paramService.querySpecParams(categoryId, null, null);
        // 2.2.把param组装到map中
        Map<Long, List<SpecParamDTO>> map = allParams.stream()
                .collect(Collectors.groupingBy(SpecParamDTO::getGroupId));
        /*Map<Long, List<SpecParamDTO>> map = new HashMap<>();
        for (SpecParamDTO paramDTO : allParams) {
            // 获取param所属的组
            Long groupId = paramDTO.getGroupId();
            // 判断是否已经存在
            if(!map.containsKey(groupId)){
                // 不存在，需要新增一个集合
                map.put(groupId, new ArrayList<>());
            }
            // 拿出这个list，然后把param放进去
            map.get(groupId).add(paramDTO);
        }*/

        // 3.查询每个组的规格参数
        for (SpecGroupDTO groupDTO : groupDTOList) {
            // 2.1.获取groupId
            Long groupId = groupDTO.getId();
            // 2.2.根据groupId查询param
            List<SpecParamDTO> params = map.get(groupId);
            // 2.3.设置params
            groupDTO.setParams(params);
        }
        return groupDTOList;
    }
}